package dao.jdbc;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import model.Anlage;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class AnlageJdbcDaoTest {

  Connection con;
  AnlageJdbcDao jdbcAnlage = new AnlageJdbcDao();
  TestDaten testdaten;
  SimpleDateFormat sdf;

  @Before
  public void setUp() throws Exception {
    

   sdf= new SimpleDateFormat("yyyy/MM/dd HH:mm");

    testdaten = new TestDaten();

    Class.forName("com.mysql.jdbc.Driver");

    con = DriverManager.getConnection("jdbc:mysql://localhost/", "root", "");

    assertNotNull(con);
    assertFalse(con.isClosed());

    Statement statement = con.createStatement();

    statement.execute("SET AUTOCOMMIT = 0;");

    statement.execute("DROP DATABASE Terminplaner;"); // !!

    statement.execute("CREATE DATABASE Terminplaner;");
    statement
        .execute("CREATE TABLE  Terminplaner.termine (ID INT AUTO_INCREMENT PRIMARY KEY, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, thema VARCHAR(99) NOT NULL, beschreibung VARCHAR(9999) NOT NULL, terminanfang VARCHAR(99) NOT NULL, terminende VARCHAR(99) NOT NULL, terminart VARCHAR(99) NOT NULL, prioritaet INT NOT NULL) ENGINE = MYISAM ");
    statement
        .execute("CREATE TABLE  Terminplaner.adressen(ID INT AUTO_INCREMENT PRIMARY KEY, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, TerminID INT NOT NULL, ort VARCHAR(99) NOT NULL, plz VARCHAR(99) NOT NULL, strasse VARCHAR(99) NOT NULL, land VARCHAR(99) NOT NULL) ENGINE = MYISAM ");
    statement
        .execute("CREATE TABLE  Terminplaner.teilnehmer(ID INT AUTO_INCREMENT PRIMARY KEY, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, TerminID INT NOT NULL, vorname VARCHAR(99) NOT NULL, nachname VARCHAR(99) NOT NULL, anrede VARCHAR(99) NOT NULL) ENGINE = MYISAM ");
    statement
        .execute("CREATE TABLE  Terminplaner.anlagen(ID INT AUTO_INCREMENT PRIMARY KEY, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, TerminID INT NOT NULL, beschreibung VARCHAR(99) NOT NULL, pfad VARCHAR(99) NOT NULL, timestampanlage VARCHAR(99) NOT NULL) ENGINE = MYISAM ");

   statement.execute("ALTER TABLE  Terminplaner.termine CHANGE  timestamp  timestamp TIMESTAMP NULL DEFAULT NULL");
   statement.execute("ALTER TABLE  Terminplaner.anlagen CHANGE  timestamp  timestamp TIMESTAMP NULL DEFAULT NULL");
   
   
  }


 

  @Test
  public void testSaveUpdate() throws IOException {
    jdbcAnlage.save(con, testdaten.testAnlage);
    testdaten.testAnlage.setBeschreibung("bababubu");
    testdaten.testAnlage.setPfad("zuhause");
    testdaten.testAnlage.setTimestamp(new Date());
    jdbcAnlage.save(con, testdaten.testAnlage);
    
    assertEquals(testdaten.testAnlage, jdbcAnlage.findById(con, new Long(1)));

  }

  @Test
  public void testDelete() throws IOException {
    jdbcAnlage.save(con, testdaten.testAnlage);
    jdbcAnlage.delete(con, testdaten.testAnlage);
    assertTrue(jdbcAnlage.findAll(con).isEmpty());
  }

  @Test
  public void testFindById() throws IOException {
    jdbcAnlage.save(con, testdaten.testAnlage);
    jdbcAnlage.save(con, testdaten.testAnlage2);
    assertEquals(testdaten.testAnlage, jdbcAnlage.findById(con, new Long(1)));
    assertEquals(testdaten.testAnlage2, jdbcAnlage.findById(con, new Long(2)));
  }

  @Test
  public void testFindAll() throws IOException {
    jdbcAnlage.save(con, testdaten.testAnlage);
    jdbcAnlage.save(con, testdaten.testAnlage2);
    jdbcAnlage.save(con, testdaten.testAnlage3);
    jdbcAnlage.save(con, testdaten.testAnlage4);
    ArrayList<Anlage> anlagen = jdbcAnlage.findAll(con);
    assertEquals(4, anlagen.size());
    assertTrue(anlagen.contains(testdaten.testAnlage));
    assertTrue(anlagen.contains(testdaten.testAnlage2));
    assertTrue(anlagen.contains(testdaten.testAnlage3));
    assertTrue(anlagen.contains(testdaten.testAnlage4));
  }

  @Test
  public void testFindByTerminId() throws IOException {
    jdbcAnlage.save(con, testdaten.testAnlage);
    jdbcAnlage.save(con, testdaten.testAnlage2);
    jdbcAnlage.save(con, testdaten.testAnlage3);
    jdbcAnlage.save(con, testdaten.testAnlage4);
    ArrayList<Anlage> anlagen = jdbcAnlage.findByTerminId(con, new Long(-999));
    
    
    assertEquals(4, anlagen.size());
    assertTrue(anlagen.contains(testdaten.testAnlage));
    assertTrue(anlagen.contains(testdaten.testAnlage2));
    assertTrue(anlagen.contains(testdaten.testAnlage3));
    assertTrue(anlagen.contains(testdaten.testAnlage4));
  }

  @Test
  public void testSaveInsert() throws IOException {
    jdbcAnlage.save(con, testdaten.testAnlage4);
    
    Anlage anlage = testdaten.testAnlage4;
    Anlage anlagevonDB = jdbcAnlage.findById(con, new Long(1));
    
    
    assertEquals(anlage.getBeschreibung(), anlagevonDB.getBeschreibung());
    assertEquals(anlage.getPfad(), anlagevonDB.getPfad());
    
    
    assertTrue(sdf.format(anlage.getTimestamp()).equals(sdf.format(anlagevonDB.getTimestamp())));
    
  }

  
  @After
  public void AfterClass() throws SQLException {

    if (!con.isClosed())
      con.close();

  }
}
